package br.com.simulador.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@Table(name = "tbl_simulado")

public class Simulado extends BaseEntity implements Serializable {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	private String descricao;

	@Temporal(TemporalType.TIMESTAMP)
	private Date disponivel_ate;

	private Boolean dinamica;

	private Long quantidade_questao;

	private Long tempo_reposta;

	@ManyToMany(cascade={CascadeType.DETACH}, fetch=FetchType.EAGER)
	@JoinTable(name = "tbl_tag_simulado", 
		joinColumns = @JoinColumn(name = "sim_id", referencedColumnName = "id"), 
		inverseJoinColumns = @JoinColumn(name = "tag_id", referencedColumnName = "id")
	)
	private List<Tag> tags=new ArrayList<Tag>();	

	@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY, mappedBy="simulado")

	private List<Questao> questoes=new ArrayList<Questao>();	
	
	
	@ManyToOne
	private StatusSimulado status;

	@Override
	public Long getId() {

		return id;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Date getDisponivel_ate() {
		return disponivel_ate;
	}

	public void setDisponivel_ate(Date disponivel_ate) {
		this.disponivel_ate = disponivel_ate;
	}

	public Boolean getDinamica() {
		return dinamica;
	}

	public void setDinamica(Boolean dinamica) {
		this.dinamica = dinamica;
	}

	public Long getQuantidade_questao() {
		return quantidade_questao;
	}

	public void setQuantidade_questao(Long quantidade_questao) {
		this.quantidade_questao = quantidade_questao;
	}

	public Long getTempo_reposta() {
		return tempo_reposta;
	}

	public void setTempo_reposta(Long tempo_reposta) {
		this.tempo_reposta = tempo_reposta;
	}

	public StatusSimulado getStatus() {
		return status;
	}

	public void setStatus(StatusSimulado status) {
		this.status = status;
	}

	public List<Tag> getTags() {
		return tags;
	}

	public List<Questao> getQuestoes() {
		return questoes;
	}

	public void setId(Long id) {
		this.id = id;
	}

}
